package controller;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;

import model.Computador;
import model.Manutencao;
import dao.ComputadorDAO;
import dao.ManutencaoDAO;

public class ManutencaoController implements ControllerBrowse {

	private ManutencaoDAO manutencaoDAO;
	private ComputadorDAO computadorDAO;
	private static ManutencaoController instance;

	private ManutencaoController() {
	}

	public static ManutencaoController getInstance() {
		if (instance == null) {
			instance = new ManutencaoController();
		}
		return instance;
	}

	public boolean inserirManutencao(int idComputador, String descricaoDefeito,
			String descricaoSolucao, double custo, String data) throws Exception {
		Computador computador = getComputadorDAO().buscarComputadorPorId(idComputador);
		Manutencao manutencao = new Manutencao(computador, descricaoDefeito, descricaoSolucao, custo, data);
		
		validarManutencao(manutencao);
		return getManutencaoDAO().inserir(manutencao);
	}

	public boolean alterarManutencao(int id, int idComputador, String descricaoDefeito,
			String descricaoSolucao, double custo, String data) throws Exception {
		Computador computador = getComputadorDAO().buscarComputadorPorId(idComputador);
		Manutencao manutencao = buscarManutencaoPorId(id);
		
		manutencao.setComputador(computador);
		manutencao.setDescricaoDefeito(descricaoDefeito);
		manutencao.setDescricaoSolucao(descricaoSolucao);
		manutencao.setCusto(custo);
		manutencao.setData(data);

		validarManutencao(manutencao);
		return getManutencaoDAO().alterar(manutencao);
	}

	public boolean excluirManutencao(int id) throws Exception {
		Manutencao manutencao = buscarManutencaoPorId(id);
		return getManutencaoDAO().delete(manutencao);
	}

	public Manutencao buscarManutencaoPorId(int id) throws Exception {
		return getManutencaoDAO().buscarManutencaoPorId(id);
	}

	public void validarManutencao(Manutencao manutencao) throws Exception {
		if (manutencao.getComputador() == null) {
			throw new Exception("Computador n�o informado!");
		}
		if (manutencao.getData() == null) {
			manutencao.setData(String.valueOf(new Date()));
		}
		if (manutencao.getDescricaoDefeito() == null
				|| manutencao.getDescricaoDefeito().isEmpty()) {
			throw new Exception("Descri��o do defeito n�o informada!");
		}
		if (manutencao.getDescricaoSolucao() == null
				|| manutencao.getDescricaoSolucao().isEmpty()) {
			throw new Exception("Descri��o da solu��o n�o informada!");
		}
	}

	public ManutencaoDAO getManutencaoDAO() {
		if (manutencaoDAO == null) {
			manutencaoDAO = new ManutencaoDAO();
		}
		return manutencaoDAO;
	}
	
	public ComputadorDAO getComputadorDAO() {
		if (computadorDAO == null){
			computadorDAO = new ComputadorDAO();
		}
		return computadorDAO;
	}

	@Override
	public ArrayList<HashMap<String, Object>> buscarDados() throws SQLException {
		return (ArrayList<HashMap<String, Object>>) getManutencaoDAO().buscarDadosManutencaoBrowse();
	}
}